home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-12 | 2.2 KB | 78 lines | [TEXT/CCL2] |
- ;;;;Eval-server.lisp
- (in-package :ccl)
- (defparameter *server-stream-plist* nil)
-
- (require "mactcp")
-
- ;in order not to get the error
-
- (defun %tcp-control (pb code &optional ignore-error-p ignore-timeout)
- (setf (rref pb tcpioPB.csCode) code
- (rref pb tcpioPB.ioCompletion) (%null-ptr))
- (let* ((err nil))
- (progn
- (loop
- (when (eql (setq err (#_control :async pb)) 0)
- (unless (eql code $TCPPassiveOpen)
- (let* ((*interrupt-level* 0))
- (while (> (setq err (rref pb tcpioPB.ioResult)) 0))))
- )
- (return))
- (unless (or ignore-error-p (eql err 0)
- (and ignore-timeout (eql err $TCPTimeout)))
- (%tcp-err-disp err))
- err))
- )
-
- (defun install-eval-handler-for-tcp-stream (stream &optional (name :eval-handler-for-tcp-stream))
- (%install-periodic-task
- name
- #'(lambda()
- (when (eql :ESTABLISHED (tcp-state-name (tcp-connection-state stream)))
- (do-eval stream)
- ))
- 100)
- )
-
- (defun do-eval (server-stream)
- (when (listen server-stream)
- ;there is something to evaluate
- (let ((eval-string (ccl::telnet-read-line server-stream))
- result)
- (setq result (ignore-errors (eval (read-from-string eval-string))))
- (ccl::telnet-write-line server-stream (format nil "~S" result))
- (values :true result))))
-
- (defun start-eval-server (&optional (name :eval-handler-for-tcp-stream))
- (let ((stream (open-tcp-stream nil 5555
- :commandtimeout 300000 ;whatever this number means
- )))
- (install-eval-handler-for-tcp-stream stream name)
- (setf (getf *server-stream-plist* name) stream)
- )
- )
-
- (defun stop-eval-server (name)
- (ccl::%remove-periodic-task name)
- ;should close the stream too
- (close
- (getf *server-stream-plist* name))
- (remf *server-stream-plist* name)
- )
-
- (defun stop-all-eval-servers ()
- (let ((servers nil))
- (do ((s *server-stream-plist* (cddr s)))
- ((endp s))
- (push (first s) servers))
- (dolist (s servers)
- (stop-eval-server s)))
- )
-
- #|
- (start-eval-server)
- (start-eval-server :this-is-the-second-server)
- (stop-eval-server :this-is-the-second-server)
- (stop-all-eval-servers)
-
- |#